//package edu.del.springbootredisbusinesspractice.service.impl;
//
//import com.rabbitmq.client.Channel;
//import edu.del.springbootredisbusinesspractice.commons.config.RabbitMQConfig;
//import edu.del.springbootredisbusinesspractice.mapper.OrdersMapper;
//import edu.del.springbootredisbusinesspractice.pojo.Orders;
//import edu.del.springbootredisbusinesspractice.service.ProductService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.messaging.handler.annotation.Header;
//import org.springframework.messaging.handler.annotation.Payload;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.util.Date;
//
//@Slf4j
//@Service
//public class OrderConsumer {
//
//    @Autowired
//    private OrdersMapper ordersMapper;
//
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//
//    @Autowired
//    private ProductService productService;
//
//    /**
//     * 处理支付成功消息
//     */
//    @RabbitListener(
//            queues = RabbitMQConfig.ORDER_PAID_QUEUE,
//            containerFactory = "jsonRabbitListenerContainerFactory"
//    )
//    public void receiveOrder(
//            @Payload Orders order,
//            Channel channel,
//            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
//
//        // 1. 判空
//        if (order == null) {
//            log.error("【支付成功处理】订单对象为 null，deliveryTag: {}", deliveryTag);
//            try {
//                // 拒绝消息且不重新入队，让它进入死信队列
//                channel.basicNack(deliveryTag, false, false);
//            } catch (IOException e) {
//                log.error("【支付成功处理】Nack 失败，deliveryTag: {}", deliveryTag, e);
//            }
//            return;
//        }
//
//        // 2. 打印一下订单号，用于调试
//        log.info("【支付成功处理】开始处理已支付订单，orderNo: {}", order.getOrderNo());
//
//        try {
//            // TODO: 核心业务逻辑，比如更新订单状态、发货、通知等
//            // 模拟业务处理.......
//
//            log.info("【支付成功处理】订单后续处理完成，orderNo: {}", order.getOrderNo());
//
//            // 手动确认消息
//            channel.basicAck(deliveryTag, false);
//
//        } catch (Exception e) {
//            log.error("【支付成功处理】处理订单时发生异常，orderNo: {}", order.getOrderNo(), e);
//
//            try {
//                // 拒绝该消息且不重新入队
//                channel.basicNack(deliveryTag, false, false);
//            } catch (IOException ex) {
//                log.error("【支付成功处理】Nack 失败，deliveryTag: {}", deliveryTag, ex);
//            }
//        }
//    }
//
//    /**
//     * 处理死信队列中的消息（支付超时的订单）
//     */
//    @RabbitListener(
//            queues = RabbitMQConfig.DEAD_LETTER_QUEUE,
//            containerFactory = "jsonRabbitListenerContainerFactory"
//    )
//    public void processDeadLetterOrder(
//            @Payload Orders order,
//            Channel channel,
//            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
//        try {
//            log.info("【支付超时检查】检查订单是否超时未支付，orderNo: {}", order.getOrderNo());
//
//            // 查询订单最新状态
//            Orders currentOrder = ordersMapper.selectByOrderNo(order.getOrderNo());;
//            if (currentOrder == null) {
//                log.warn("【支付超时检查】订单不存在，orderNo: {}", order.getOrderNo());
//                channel.basicAck(deliveryTag, false);
//                return;
//            }
//
//            // 如果订单还是未支付状态，则取消订单
//            if (currentOrder.getStatus() == 1) { // 1-未支付
//                currentOrder.setStatus(5); // 5-已取消
//                currentOrder.setUpdatedAt(new Date());
//                // 更新订单
//                int updateResult = ordersMapper.updateById(currentOrder);
//
//                if (updateResult > 0) {
//                    String stockKey = "product:" + order.getProductId() + ":stock";
//                    int count = order.getQuantity() != null ? order.getQuantity() : 1;
//
//                    redisTemplate.opsForValue().increment(stockKey, count);
//
//                    log.info("【支付超时】订单自动取消，orderNo: {}", order.getOrderNo());
//                }
//            } else {
//                log.info("【支付超时检查】订单已支付，无需处理，orderNo: {}, status: {}",
//                        order.getOrderNo(), currentOrder.getStatus());
//            }
//
//            channel.basicAck(deliveryTag, false);
//
//        } catch (Exception e) {
//            log.error("【支付超时检查】处理异常，orderNo: {}", order.getOrderNo(), e);
//            try {
//                channel.basicNack(deliveryTag, false, false);
//            } catch (Exception ex) {
//                log.error("【支付超时检查】确认消息异常", ex);
//            }
//        }
//    }
//
//    /**
//     * 处理取消订单的消息
//     */
//    @RabbitListener(
//            queues = RabbitMQConfig.ORDER_CANCEL_QUEUE,
//            containerFactory = "jsonRabbitListenerContainerFactory"
//    )
//    public void processCancelOrder(
//            @Payload Orders order,
//            Channel channel,
//            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
//        try {
//
//            log.info("【取消订单处理】开始处理取消订单，orderNo: {}", order.getOrderNo());
//            // ===========================
//            // TODO: 在这里实现真正的取消后业务逻辑
//            // 例如：
//            // 1. 通知用户（短信 / 邮件 / 站内信）
//            // 2. 如果已支付，触发退款流程
//            // 3. 记录取消原因、操作人等
//            // 4. 通知物流系统取消发货
//            // ===========================
//            log.info("【取消订单处理】订单取消后续处理完成，orderNo: {}", order.getOrderNo());
//            // 手动确认消息
//            channel.basicAck(deliveryTag, false);
//        } catch (Exception e) {
//            log.error("【取消订单处理】处理取消订单异常，orderNo: {}", order.getOrderNo(), e);
//            try {
//                // 处理失败，拒绝消息且不重新入队（先不考虑进死信队列）
//                channel.basicNack(deliveryTag, false, false);
//            } catch (IOException ex) {
//                log.error("【取消订单处理】消息确认异常，orderNo: {}", order.getOrderNo(), ex);
//            }
//        }
//    }
//}
